package io.mft.plugin;

import io.mft.commons.exception.MFTException;
import io.mft.commons.function.ExecuteReturn;
import io.mft.commons.function.RequestValue;
import io.mft.commons.ioc.MFTSpringUtil;

/**
 * 插件功能调用
 * 
 * @说明：TODO
 * @类型名称：PluginInvoker
 * @创建者: 胡常建
 * @创建时间: 2021年4月2日 上午11:30:53
 * @修改者: 胡常建
 * @修改时间: 2021年4月2日 上午11:30:53
 */
public class PluginInvoker {

	public static String pluginId="mainSys";
	public static <T> ExecuteReturn invoke(String funcNo, PluginRequest request,PluginResponse response, T value) {
		PluginFunctionExecutor<T> executor = instancePluginFunctionExecutor(funcNo);
		if (executor == null) {
			throw new MFTException(-1, "插件[" + pluginId + "]功能[" + funcNo + "]不存在,请检查！");
		}
		PluginContext<T> context = new PluginContext<T>(request, value, response);
		ExecuteReturn executeReturn = executor.doExecute(context);
		return executeReturn;
	}

	public static PluginResponse invoke(String funcNo, RequestValue request) {
		PluginResponse response = new PluginResponse();
		PluginRequest pluginRequest = new PluginRequest(request);
		invoke(funcNo, pluginRequest, response, request);
		return response;
	}
	@SuppressWarnings("unchecked")
	public static <T> PluginFunctionExecutor<T> instancePluginFunctionExecutor(String funcNo) {
		PluginFunction<?> function=MFTSpringUtil.getInstance(pluginId,funcNo, PluginFunction.class);
		PluginFunction<T> tfFunction=(PluginFunction<T>)function;
		PluginFunctionExecutor<T> pluginFunctionExecutor = new PluginFunctionExecutor<T>(tfFunction,"", PluginInvoker.class.getClassLoader());
		return pluginFunctionExecutor;
	}
}
